package com.eva.ss;

import com.eva.framework.config.AppConfig;
import com.eva.framework.rbac.model.RbacUserInfo;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * 默认用户缓存
 */
@Component
public class UserDetailsCache {

    @Resource
    private AppConfig appConfig;

    @Resource(name = "userRedisTemplate")
    private RedisTemplate<String, RbacUserInfo> redisTemplate;

    /**
     * 写入用户信息到缓存中
     *
     * @param token 登录令牌
     * @param value 用户信息
     */
    public void put(String token, RbacUserInfo value) {
        redisTemplate.opsForValue().set(this.getTokenCacheKey(token), value, appConfig.getSession().getExpire(), TimeUnit.SECONDS);
    }

    /**
     * 获取用户信息
     *
     * @param token 登录令牌
     * @return LoginUserInfo
     */
    public RbacUserInfo get (String token) {
        return redisTemplate.opsForValue().get(this.getTokenCacheKey(token));
    }

    /**
     * 删除用户信息
     * @param token 登录令牌
     */
    public void remove (String token) {
        redisTemplate.delete(this.getTokenCacheKey(token));
    }

    /**
     * 重新延长登录令牌的存储时长
     *
     * @param token 登录令牌
     */
    public void relive (String token) {
        redisTemplate.opsForValue().getOperations().expire(this.getTokenCacheKey(token), appConfig.getSession().getExpire(), TimeUnit.SECONDS);
    }

    /**
     * 获取登录令牌缓存Key
     *
     * @param token 登录令牌
     * @return 缓存Key
     */
    private String getTokenCacheKey(String token) {
        return appConfig.getSession().getTokenCachePrefix() + token;
    }
}
